<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>rdebug_compile_routine: common_schema documentation</title>
	<meta name="description" content="rdebug_compile_routine: common_schema" />
	<meta name="keywords" content="rdebug_compile_routine: common_schema" />
	<link rel="stylesheet" type="text/css" href="css/style.css" />
</head>

<body>
	<div id="main">
		<div id="header">
			<h1>common_schema</h1> <strong>2.2</strong> documentation
			<div class="subtitle">DBA's framework for MySQL</div>
		</div>
		<div id="contentwrapper">
			<div id="content">
				<h2><a href="rdebug_compile_routine.html">rdebug_compile_routine</a></h2>	
<h3>NAME</h3>
rdebug_compile_routine(): Rebuild a routine with/without debugging info.

<h3>TYPE</h3>
Procedure

<h3>DESCRIPTION</h3>
<p>
	This procedure is part of the <a href="rdebug_api.html">rdebug API</a>.
</p>
<p>
	<i>rdebug_compile_routine()</i> modifies a routine code to include/exclude debug info.
</p>

<p>
	<strong>rdebug</strong> works by injecting debug code into stored routines. In order
	to debug a routine, one must first make sure it is "compiled with debug mode"
	(though technically the routine is never <i>compiled</i>).
</p>
<p>
	<i>rdebug_compile_routine()</i> works on the very code of one's routine, and injects
	variables & statements to manage the debugging process. These variables and statements
	do not modify the behavior of the routine: executed outside a debugging session, it
	should act exactly the same way as a "normal" routine with no debug info.
</p>
<p>
	This also makes for a routine's code bloat and possible slow down to to the fact it is
	interpreted by MySQL (therefore more code to interpret).
</p>
<p>
	Once the debugging session is complete, one wishes to remove the injected debug code
	from the routine. <i>rdebug_compile_routine()</i> will strip down the debug code and
	restore the routine to the exact same original code. 
</p>
<p>
	Compiling a routine twice with debug info is valid, though the 2nd call makes no
	difference. Likewise, Compiling the routine twice without debug info is fine,
	and the second call makes no changes to the code.
</p>
<p>
	Execution of this routine should take place outside a debugging session (typically
	compiling with debug info beforehand, and compiling without debug info afterwards).
</p>

<h3>SYNOPSIS</h3>
<p>
<blockquote><pre>rdebug_compile_routine(
    in rdebug_routine_schema varchar(128) charset utf8,
    in rdebug_routine_name   varchar(128) charset utf8,
    in debug_info     bool
  )
  MODIFIES SQL DATA
</pre></blockquote>
</p>
<p>
  Input: 
  <ul>
    <li><strong>rdebug_routine_schema</strong>: schema where routine is located.</li>
    <li><strong>rdebug_routine_name</strong>: name of routine to compile.</li>
    <li><strong>debug_info</strong>: <strong>TRUE</strong> or <strong>1</strong> to inject
    	debug code into the routine, <strong>FALSE</strong> or <strong>0</strong> to
    	remove debug code from the routine and return to original code.
	</li>
  </ul>
</p>


<h3>EXAMPLES</h3>
	<p>
		Compile routine with debug info. Show routine before/after:
	<blockquote><pre>mysql&gt; call rdebug_show_routine('test','analyze_continents');
+------------------------------------------------------------+
| `test`.`analyze_continents` breakpoints                    |
+------------------------------------------------------------+
| main_body: begin                                           |
|   declare done bool default false;                         |
|   declare current_continent varchar(32) default null;      |
|   declare continents_cursor cursor for                     |
|             select distinct continent from world.Country;  |
|   declare continue handler for not found set done := true; |
|                                                            |
|   open continents_cursor;                                  |
|   cursor_loop: while not done do                           |
|     fetch continents_cursor into current_continent;        |
|     if done then                                           |
|       leave cursor_loop;                                   |
|     end if;                                                |
|     call analyze_continent_cities(current_continent);      |
|   end while;                                               |
|   close continents_cursor;                                 |
| end                                                        |
+------------------------------------------------------------+

mysql&gt; call rdebug_compile_routine('test','analyze_continents', true);

mysql&gt; call rdebug_show_routine('test','analyze_continents');
+-------------------------------------------------------------+
| `test`.`analyze_continents` breakpoints                     |
+-------------------------------------------------------------+
| main_body: begin                                            |
|   declare done bool default false;                          |
|   declare current_continent varchar(32) default null;       |
|   declare continents_cursor cursor for                      |
|             select distinct continent from world.Country;   |
|   declare continue handler for not found set done := true;  |
|                                                             |
|   [:80]open continents_cursor;                              |
|   [:86]cursor_loop: while not done do                       |
|     [:98]fetch continents_cursor into current_continent;    |
|     [:108]if done then                                      |
|       [:115]leave cursor_loop;                              |
|     [:121]end if;                                           |
|     [:127]call analyze_continent_cities(current_continent); |
|   [:136]end while;                                          |
|   [:142]close continents_cursor;                            |
| [:147]end                                                   |
+-------------------------------------------------------------+
</pre></blockquote>
The actual injected routine code is far more complex and is not presented here.
</p>

<h3>ENVIRONMENT</h3>
MySQL 5.1 or newer

<h3>SEE ALSO</h3>
<a href="rdebug_show_routine.html">rdebug_show_routine()</a>,
<a href="rdebug_show_routine_statements.html">rdebug_show_routine_statements()</a>

<h3>AUTHOR</h3>
Shlomi Noach
				<br/>
			</div>
			<div id="sidebarwrapper">
				<div id="search">
					Search online documentation
					<form id="search_form" name="search_form" method="GET" 
						action="http://www.google.com/search" 
						onsubmit="document.forms['search_form']['q'].value = 'site:http://common-schema.googlecode.com/svn/trunk/common_schema/doc/html/ '+document.forms['search_form']['search_term'].value;">
						<input type="text" name="search_term" value=""/>
						<input type="hidden" name="q" value=""/>
						<input type="submit" value="go"/>						
					</form>
				</div>
				<div id="menu">
					<ul>
						<li><a title="Introduction" href="introduction.html">Introduction</a></li>
						<li><a title="Documentation" href="documentation.html">Documentation</a></li>
						<li><a title="Download" href="download.html">Download</a></li>
						<li><a title="Install" href="install.html">Install</a></li>
						<li><a title="Risks" href="risks.html">Risks</a></li>
					</ul>						
					<h3>QUERY SCRIPT</h3>
					<ul>
						<li><a title="QueryScript" href="query_script.html">QueryScript</a></li>
						<li><a title="Execution" href="query_script_execution.html">Execution</a></li>
						<li><a title="Flow control" href="query_script_flow_control.html">Flow control</a></li>
						<li><a title="Statements" href="query_script_statements.html">Statements</a></li>
						<li><a title="Expressions" href="query_script_expressions.html">Expressions</a></li>
						<li><a title="Variables" href="query_script_variables.html">Variables</a></li>
					</ul>						
					<h3>DEBUG</h3>
					<ul>
						<li><a title="rdebug" href="rdebug.html">rdebug</a></li>
						<li><a title="rdebug API" href="rdebug_api.html">rdebug API</a></li>
						<li><a title="rdebug workflow" href="rdebug_workflow.html">Workflow</a></li>
					</ul>						
					<h3>ROUTINES</h3>
					<ul>
						<li><a title="Execution &amp; flow control" href="execution_routines.html">Execution & flow control</a></li>
						<li><a title="General" href="general_routines.html">General</a></li>
						<li><a title="Process" href="process_routines.html">Process</a></li>
						<li><a title="Query analysis" href="query_analysis_routines.html">Query analysis</a></li>
						<li><a title="Schema analysis" href="schema_analysis_routines.html">Schema analysis</a></li>
						<li><a title="Security" href="security_routines.html">Security</a></li>
						<li><a title="Text" href="text_routines.html">Text</a></li>
						<li><a title="Time &amp; date" href="temporal_routines.html">Time & date</a></li>
						<li><a title="Charting" href="charting_routines.html">Charting</a></li>
					</ul>
					<h3>VIEWS</h3>
					<ul>
						<li><a title="Schema analysis" href="schema_analysis_views.html">Schema analysis</a></li>
						<li><a title="Data dimension" href="data_dimension_views.html">Data dimension</a></li>
						<li><a title="Process" href="process_views.html">Process</a></li>
						<li><a title="Security" href="security_views.html">Security</a></li>
						<li><a title="Monitoring" href="monitoring_views.html">Monitoring</a></li>
						<li><a title="InnoDB Plugin" href="innodb_plugin_views.html">InnoDB Plugin</a></li>
						<li><a title="Percona server" href="percona_server_views.html">Percona Server</a></li>
						<li><a title="TokuDB" href="tokudb_views.html">TokuDB</a></li>
					</ul>						
					<h3>DATA</h3>
					<ul>
						<li><a title="tables" href="tables.html">Tables</a></li>
						<li><a title="variables" href="variables.html">Variables</a></li>
					</ul>						
					<h3>META</h3>
					<ul>
						<li><a title="Help" href="help.html">help</a></li>
						<li><a title="Metadata" href="metadata.html">metadata</a></li>
						<li><a title="status" href="status.html">status</a></li>
					</ul>						
				</div>
			</div>	
			<div class="clear">&nbsp;</div>
			
			<div id="footnote" align="center">
				<a href="">common_schema</a> documentation
			</div>
		</div>
	</div>
</body>
</html>
